package com.thread.xxstudy;


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 多线程使用固定线程池计数
 *1.提交到线程池中的任务尽量不适用new创建   或者创建后也要使用同一个  否则创建出来的对象不是同一个对象，是不同的堆栈内存，操作的变量a也不是同一个
 *2.ExecitorService.shutdown 关闭之前会让执行的任务执行完，只是不再接收新的任务
 */
public class ThreadInFixedPool {

    public final static int threadPoolCount = 4;
    public int a = 0;

  /*  public static void main(String[] args) {
        ThreadInFixedPool threadTest = new ThreadInFixedPool();
        threadTest.fixedPool();
    }*/

    public void fixedPool() {
        //使用工具类 Executors创建线程池
        //固定线程池
        ExecutorService executorService = Executors.newFixedThreadPool(threadPoolCount);
        ThreadInFixedPool threadTest = new ThreadInFixedPool();
        MyRun myRun = threadTest.new MyRun();
        for (int i = 0; i < 10; i++) {
            //提交任务
            executorService.submit(myRun);
        }

        //shutdown在关闭线程池前会执行完之前的任务，只是不会再添加新的任务了
        //如果没有新任务了，可以直接关闭 不会影响正在执行的任务
        executorService.shutdown();
        System.out.println("关闭线程池-shutdown");
    }

    class MyRun implements Runnable {
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (this) {
                System.out.println(Thread.currentThread().getName() + "==========" + ++a);
            }

        }
    }
}
